package com.c2b.algorithm.leetcode.jzoffer;

/**
 * <a href="https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&&tqId=11181&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking">数组中出现次数超过一半的数字</a>
 * <p>给一个长度为 n 的数组，数组中有一个数字出现的次数超过数组长度的一半，请找出这个数字。</p>
 * <p>例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次，超过数组长度的一半，因此输出2。</p>
 * <p>数据范围：n≤50000，数组中元素的值 0≤val≤10000</p>要求：空间复杂度：O(1)，时间复杂度O(n)
 * <p>输入描述：保证数组输入非空，且保证有解</p>
 *
 * @author c2b
 * @since 2023/3/8 9:29
 */
public class JzOffer0039MajorityElement_S {

    public int majorityElement(int[] nums) {
        // 保证数组输入非空，且保证有解。不需要做健壮性检验
        // 假设第一个元素是出现的次数超过数组长度的一半的数字
        int res = nums[0];
        int times = 1;
        for (int i = 1; i < nums.length; i++) {
            if (times == 0) {
                res = nums[i];
            }
            times += res == nums[i] ? 1 : -1;

        }
        return res;
    }

    public static void main(String[] args) {
        JzOffer0039MajorityElement_S jzOffer0039MoreThanHalfNum = new JzOffer0039MajorityElement_S();
        System.out.println(jzOffer0039MoreThanHalfNum.majorityElement(new int[]{1}));
    }
}
